package com.telcordia.cvas.rpn;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class ANewlyCreatedRpnCalculatorShould {
	private RpnCalculator rpnCalculator;

	@Before
	public void init() {
		rpnCalculator = new RpnCalculator();
	}
	
	@Test(expected = RuntimeException.class)
	public void throwAnExceptionIfOperatorNotKnown() {
		rpnCalculator.perform("A bogus Operator that is not there");
	}
	
	@Test
	public void beAbleToSubtract() {
		rpnCalculator.perform("-");
	}
	
	@Test
	public void beAbleToAdd() {
		rpnCalculator.setXRegister(5);
		rpnCalculator.enter();
		rpnCalculator.perform("+");
		assertEquals(10, rpnCalculator.getXRegister());
	}
	
	@Test
	public void calculateTheFactorialOf0ToBe1() {
		rpnCalculator.factorial();
		assertEquals(1, rpnCalculator.getXRegister());
	}
	
	@Test
	public void calculateTheFactorialOf5ToBe120() {
		rpnCalculator.setXRegister(5);
		rpnCalculator.factorial();
		assertEquals(120, rpnCalculator.getXRegister());
	}
	
	@Test
	public void resultIn0WhenAddingWithNoNumbers() {
		rpnCalculator.perform("+");
		assertEquals(0, rpnCalculator.getXRegister());
	}
	
	@Test
	public void allowsItXRegsiterToBeSet() {
		rpnCalculator.setXRegister(42);
		assertEquals(42, rpnCalculator.getXRegister());
	}
	
	@Test
	public void initiallyHaveZero() {
		assertEquals(0, rpnCalculator.getXRegister());
	}
}
